package sgsi.model.alocacion;

import java.util.Iterator;
import java.util.List;

import sgsi.model.entidades.Palet;
import sgsi.model.entidades.TipoDePalet;
import sgsi.model.entidades.espacios.Area;
import sgsi.model.entidades.espacios.Ubicacion;

public class CriterioOrdenAreasPorCapacidad implements CriterioOrdenAreas {

	private int paletsParaAlocar;
	private TipoDePalet tipoDePalet;
	private float alto;
	private float peso;
	

	public void initCriterio(List<Palet> palets) {
		// Seteo los datos iniciales (para palets homogeneos)
		paletsParaAlocar = palets.size();
		tipoDePalet = palets.get(0).getTipoDePalet();
		alto = palets.get(0).getAltura();
		peso = palets.get(0).getPeso();
	}

	public int compare(Area area1, Area area2) {
		Integer puntajeArea1 = calcularPuntaje(area1);
		Integer puntajeArea2 = calcularPuntaje(area2);
		
		if (puntajeArea1 < puntajeArea2)
			return 1;
		
		if (puntajeArea1 > puntajeArea2)
			return -1;
		
		if (area1.getCodigoArea() < area2.getCodigoArea())
			return -1;
		
		if (area1.getCodigoArea() > area2.getCodigoArea())
			return 1;
		
		return 0;
	}

	private Integer calcularPuntaje(Area area) {
		int paletsAlocados = 0;
		float espacioOcupadoAhora = 0;
		float espacioOcupadoPrevio = 0;
		float espacioTotal = 0;
		
		Iterator<Ubicacion> iterarUbicaciones = area.getUbicaciones().iterator();
		while (iterarUbicaciones.hasNext()) {
			Ubicacion  ubicacion = iterarUbicaciones.next();								
			int cantidadRestante = paletsParaAlocar - paletsAlocados; 
			int cantidad = 0;
			int cantidadAlocada = 0;
			
			cantidad = ubicacion.cantidadDisponiblePara(tipoDePalet, alto, peso);
			
			if (cantidadRestante > 0) {							
				if (cantidad > cantidadRestante)
					cantidadAlocada = cantidadRestante;
				else
					cantidadAlocada = cantidad;
			}
			
			//Acumulo los palets que podria alocar y sumo los espacios ocupados y totales
			paletsAlocados = paletsAlocados + cantidadAlocada;
			espacioOcupadoAhora = espacioOcupadoAhora + (cantidadAlocada * tipoDePalet.getAncho() * tipoDePalet.getLargo());
			espacioOcupadoPrevio = espacioOcupadoPrevio + ubicacion.getEspacioOcupado();
			espacioTotal = espacioTotal + (ubicacion.getAncho() * ubicacion.getProfundidad());						
		}
		
		int puntaje = 0;
		if (paletsAlocados == paletsParaAlocar)
		{
			/* Si pude alocar todo el puntaje va entre 50 y 90
			 * Calculo el porcentaje de espacio ocupado del Area
			*/
			puntaje = 50 + ((int) ((espacioOcupadoAhora + espacioOcupadoPrevio) / espacioTotal * 40));
		}
		else
		{
			/* Si NO pude alocar todo el puntaje va entre 0 y 40
			 * Calculo el porcentaje de palets que se alocarian
			 */
			puntaje = ((int) (paletsAlocados / paletsParaAlocar * 40));
		}
		
		//Ahora sumo la prioridad - Prioridad entre (3 y 9)
		puntaje = puntaje + (area.getPrioridad().getPonderacion() * 3);
		
		return puntaje;				
	}

}
